package network.server.session;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import network.server.ClientHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 会话管理器，负责管理服务器端的所有客户端会话。
 * <p>
 * 每个会话对应一个 {@link ClientHandler} 实例，通过 sessionId 或用户ID进行映射。
 * 支持用户和游客会话区分，提供增加、获取、移除会话以及获取在线用户状态的方法。
 */
public class SessionManager {

    /** 存储用户ID或会话ID到 ClientHandler 的映射 */
    private static final Map<String, ClientHandler> sessionMap = new ConcurrentHashMap<>();

    private static final Logger logger = LoggerFactory.getLogger(SessionManager.class);

    /**
     * 生成会话键
     *
     * @param isGuest 是否为游客
     * @param id 用户ID或游客ID
     * @return 会话键
     */
    private static String generateKey(boolean isGuest, String id) {
        return (isGuest ? "guest:" : "user:") + id;
    }

    /**
     * 添加会话
     *
     * @param isGuest 是否为游客
     * @param id 用户ID或游客ID
     * @param handler 对应的 ClientHandler
     * @return 返回生成的 sessionId
     */
    public static String addSession(boolean isGuest, String id, ClientHandler handler) {
        String userSessionId = generateKey(isGuest, id);
        sessionMap.put(userSessionId, handler);
        return userSessionId;
    }

    /**
     * 根据用户ID获取会话
     *
     * @param isGuest 是否为游客
     * @param id 用户ID或游客ID
     * @return 对应的 ClientHandler，如果不存在返回 null
     */
    public static ClientHandler getSession(boolean isGuest, String id) {
        return sessionMap.get(generateKey(isGuest, id));
    }

    /**
     * 根据 sessionId 获取会话
     *
     * @param sessionId 会话ID
     * @return 对应的 ClientHandler，如果不存在返回 null
     */
    public static ClientHandler getSession(String sessionId) {
        return sessionMap.get(sessionId);
    }

    /**
     * 移除会话（通过用户ID）
     *
     * @param isGuest 是否为游客
     * @param id 用户ID或游客ID
     */
    public static void removeSession(boolean isGuest, String id) {
        sessionMap.remove(generateKey(isGuest, id));
    }

    /**
     * 根据 ClientHandler 移除会话
     *
     * @param handler 对应的 ClientHandler
     */
    public static void removeSessionByHandler(ClientHandler handler) {
        sessionMap.entrySet().removeIf(e -> e.getValue() == handler);
    }

    /**
     * 获取所有在线会话
     *
     * @return 会话映射表 (sessionId -> ClientHandler)
     */
    public static Map<String, ClientHandler> getAllSessions() {
        return sessionMap;
    }

    // ========================= Server端辅助方法 =========================

    /**
     * 根据 sessionId 获取当前用户状态信息
     *
     * @param sessionId 会话ID
     * @return 用户状态信息 Map，如果不存在返回 null
     */
    public static Map<String, Object> getUserStatusBySessionId(String sessionId) {
        ClientHandler handler = sessionMap.get(sessionId);
        if (handler != null) {
            return handler.getCurrentUserStatus();
        }
        return null;
    }

    /**
     * 获取所有在线用户状态信息
     *
     * @return map 映射 (sessionId -> 用户状态信息)
     */
    public static Map<String, Map<String, Object>> getAllUserStatuses() {
        Map<String, Map<String, Object>> statusMap = new HashMap<>();
        for (Map.Entry<String, ClientHandler> entry : sessionMap.entrySet()) {
            statusMap.put(entry.getKey(), entry.getValue().getCurrentUserStatus());
        }
        return statusMap;
    }
}
